package tech.heptagram.staff.service;

import com.github.pagehelper.PageInfo;

import java.util.List;

import tech.heptagram.staff.model.Staff;
import tech.heptagram.staff.model.StaffAuthException;
import tech.heptagram.staff.query.StaffQuery;
import tech.heptagram.staff.query.StaffRemoveReq;
import tech.heptagram.staff.query.StaffSaveReq;

/**
 * @author wang.yuchuan
 * @date 2018/9/5
 */
public interface StaffService {

    DepartmentService getDepartmentService();

    BpmsProcessService getBpmsProcessService();

    ProcessRecordService getProcessRecordService();

    /**
     * 新建员工
     *
     * @param staffSaveReq 保存新员工参数
     * @return 新员工编码
     */
    String saveStaff(StaffSaveReq staffSaveReq);

    /**
     * 修改员工信息
     *
     * @param staffSaveReq 要修改的员工信息
     */
    void updateStaff(StaffSaveReq staffSaveReq);

    /**
     * 员工账号认证
     *
     * @param account  账号, 一般是员工手机号
     * @param password 密码
     * @return 认证成功, 返回员工对象, 否则会抛出异常
     * @throws StaffAuthException 认证异常
     */
    Staff auth(String account, String password) throws StaffAuthException;

    /**
     * 更改员工花名
     *
     * @param staffCode
     * @param nickName
     */
    void updateStaffNickname(String staffCode, String nickName);

    /**
     * 查询所有符合条件的员工列表, 分页显示
     *
     * @param staffQuery
     * @return
     */
    PageInfo<Staff> findStaffsWithPage(StaffQuery staffQuery);

    /**
     * 查询所有符合条件的员工列表, 不分页
     *
     * @param staffQuery
     * @return
     */
    List<Staff> findStaffs(StaffQuery staffQuery);

    /**
     * 根据员工编码批量获取员工信息
     *
     * @param staffCodes 员工编码s
     * @return 员工列表
     */
    List<Staff> findByStaffCodes(List<String> staffCodes);

    /**
     * 获取单个员工
     *
     * @param staffQuery
     * @return
     */
    Staff getStaff(StaffQuery staffQuery);

    /**
     * 根据员工编码查询员工信息
     *
     * @param staffCode
     * @return
     */
    Staff getByCode(String staffCode);

    /**
     * 根据员工名称查询员工信息
     * 支持员工真实姓名或花名或姓名拼音
     *
     * @param staffName
     * @return
     */
    Staff getByName(String staffName);

    /**
     * 根据员工手机号查询员工信息
     *
     * 支持员工个人手机号和公司手机号
     *
     * @param mobile
     * @return
     */
    Staff getByMobile(String mobile);

    /**
     * 根据企业微信用户Id获取员工信息
     *
     * @param wxUserId 企业微信id
     * @return 员工信息
     */
    Staff getByWxUserId(String wxUserId);

    /**
     * 根据钉钉ID获取员工信息
     *
     * @param dingtalkId 钉钉ID
     * @return 员工
     */
    Staff getByDingtalkId(String dingtalkId);

    /**
     * 根据花名查询员工信息
     *
     * @param nickName 花名
     * @return 员工
     */
    Staff getByNickName(String nickName);

    /**
     * 根据部门ID查询员工列表
     * @param departmentId 部门ID
     * @return 员工列表
     */
    List<Staff> getByDepartmentId(Integer departmentId);

    /**
     * 根据部门ID列表查询员工CODE列表
     * @param deptIdList 部门ID列表
     * @return 员工CODE列表
     */
    List<String> getStaffCodeListByDeptIdList(List<Integer> deptIdList);

    /**
     * 修改员工为离职状态
     * @param req
     */
    void updateStaffStatus(StaffRemoveReq req);
}
